/**
 * @brief LOG文件缓冲的buffer
 * @version 1.0
 * @author 宋炜
 * @date 2023-03-08
 */

#pragma once

#include <memory>
#include <string>

#include "mallocSharedPtr.hpp"
#include "designM/singleton.hpp"
namespace wheels
{
	class buff : public wheels::dm::singleton< buff >
	{
	public:
		using iterator = char *;
	private:
		wheels::mallocSharedPtr< char >     __pt_data;
		// 当前数据写入点。当写入数据的总长度会大于缓冲区长度会造成写入失败
		size_t  __m_curr_pos;
		size_t  __m_size;
	private:

	public:
		buff();
		virtual ~buff(){}
		/**
		 * @brief 将结果转换成标准字符串。
		 * @param rst[ O ],输出结果
		 * @return
		 */
		bool toString( std::string& rst );

		iterator begin(){ return __pt_data.get(); }
		iterator end(){ return __pt_data.get() + __m_curr_pos + 1; }

		char * buffer(){ return __pt_data.get(); }
		size_t dataSize(){ return __m_curr_pos; }
		void clear(){
			__m_curr_pos = 0;
			__pt_data.get()[0]='\0';
		}
		/**
		 * @brief buff中写入数据内容
		 * @param dataP[ I ]， 要写入的内容指针
		 * @param len[ I ]，数据长度
		 * @param clearPos，清理位置点，如果需要从头改写这个配置为true
		 * @return
		 */
		bool write( const char * data , size_t len , bool clearPos = true );
		bool write( const std::string& data , bool clearPos = true );
		/**
		 * @brief 调整缓冲区大小
		 * @param s[ I ]， 缓冲字节大小
		 * @return
		 */
		inline bool resize( size_t s )
			{
				try{
					__pt_data.resize( s );

				}catch( std::bad_alloc& e ){
					return false;
				}

				return true;
			}
		inline size_t size(){ return __m_size; }
	};

}
